<table width='100%'>
    <?php
    /**
     *
     * 一个用于PHP脚本漏洞的静态源代码分析器
     * 作者:约翰内斯·达斯
     * 版权(C) 2012 Johannes Dahse
     * 本程序为自由软件;
     * 您可以根据自由软件基金会发布的GNU通用公共许可证条款重新发布和/或修改它;
     * 许可的版本3，或者(由您选择)任何以后的版本。
     * 这个程序是希望它会有用，但没有任何保证;
     * 甚至没有对适销性或适合特定用途的隐含保证。
     * 有关更多细节，请参阅GNU通用公共许可证。
     * 您应该已经收到一份GNU通用公共许可证的副本，连同本程序;
     * 如果没有，请查看<http://www.gnu.org/licenses/>
     **/

    include('../config/general.php');

    // prepare output to style with CSS
    function highlightline($line, $line_nr, $marklines, $in_comment)
    {
        $tokens = @token_get_all('<? ' . $line . ' ?>');
        $output = (in_array($line_nr, $marklines)) ? '<tr><td nowrap class="markline">' : '<tr><td nowrap class="codeline">';

        for ($i = 0; $i < count($tokens); $i++) {
            if (is_array($tokens[$i]) && ($tokens[$i][0] === T_COMMENT || $tokens[$i][0] === T_DOC_COMMENT)
                && ($tokens[$i][1][0] === '/' && $tokens[$i][1][1] === '*' && substr(trim($tokens[$i][1]), -2, 2) !== '*/')) {
                $in_comment = true;
                if (is_array($tokens[$i]))
                    $tokens[$i][1] = str_replace('?' . '>', '', $tokens[$i][1]);
            }
            if ($tokens[$i] === '/' && $tokens[$i - 1] === '*') {
                $in_comment = false;
            }

            if ($i == count($tokens) - 1 && $tokens[$i - 1][0] !== T_CLOSE_TAG)
                $tokens[$i][1] = str_replace('?' . '>', '', $tokens[$i][1]);

            if ($in_comment) {
                if ($tokens[$i][1] !== '<?' && $tokens[$i][1] !== '?' . '>') {
                    $trimmed = is_array($tokens[$i]) ? trim($tokens[$i][1]) : trim($tokens[$i]);
                    $output .= '<span class="phps-t-comment">';
                    $output .= empty($trimmed) ? '&nbsp;' : htmlentities($trimmed, ENT_QUOTES, 'utf-8');
                    $output .= '</span>';
                }
            } else if ($tokens[$i] === '/' && $tokens[$i - 1] === '*')
                $output .= '<span class="phps-t-comment">*/</span>';
            else if (is_string($tokens[$i])) {
                $output .= '<span class="phps-code">';
                $output .= htmlentities(trim($tokens[$i]), ENT_QUOTES, 'utf-8');
                $output .= '</span>';
            } else if (is_array($tokens[$i])
                && $tokens[$i][0] !== T_OPEN_TAG
                && $tokens[$i][0] !== T_CLOSE_TAG) {
                if ($tokens[$i][0] !== T_WHITESPACE) {
                    $text = '<span ';
                    if ($tokens[$i][0] === T_VARIABLE) {
                        $cssname = str_replace('$', '', $tokens[$i][1]);
                        $text .= 'style="cursor:pointer;" name="phps-var-' . $cssname . '" onClick="markVariable(\'' . $cssname . '\')" ';
                        $text .= 'onmouseover="markVariable(\'' . $cssname . '\')" onmouseout="markVariable(\'' . $cssname . '\')" ';
                    } else if ($tokens[$i][0] === T_STRING && $tokens[$i + 1] === '(' && $tokens[$i - 2][0] !== T_FUNCTION) {
                        $text .= 'onmouseover="mouseFunction(\'' . strtolower($tokens[$i][1]) . '\', this)" onmouseout="this.style.textDecoration=\'none\'" ';
                        $text .= 'onclick="openFunction(\'' . strtolower($tokens[$i][1]) . "','$line_nr');\" ";
                    }
                    $text .= 'class="phps-' . str_replace('_', '-', strtolower(token_name($tokens[$i][0]))) . '" ';
                    $text .= '>' . htmlentities($tokens[$i][1], ENT_QUOTES, 'utf-8') . '</span>';
                } else {
                    $text = str_replace(' ', '&nbsp;', $tokens[$i][1]);
                    $text = str_replace("\t", str_repeat('&nbsp;', 8), $text);
                }

                $output .= $text;
            }
        }

        if (strstr($line, '*/'))
            $in_comment = false;

        echo $output . '</td></tr>';
        return $in_comment;
    }

    // print source code and mark lines

    $file = $_GET['file'];
    $marklines = explode(',', $_GET['lines']);
    $ext = '.' . pathinfo($file, PATHINFO_EXTENSION);


    if (!empty($file) && is_file($file) && in_array($ext, $FILETYPES)) {
        $lines = file($file);

        // place line numbers in extra table for more elegant copy/paste without line numbers
        echo '<tr><td><table>';
        for ($i = 1, $max = count($lines); $i <= $max; $i++)
            echo "<tr><td class=\"linenrcolumn\"><span class=\"linenr\">$i</span><A id='" . ($i + 2) . '\'></A></td></tr>';
        echo '</table></td><td id="codeonly"><table id="codetable" width="100%">';

        $in_comment = false;
        for ($i = 0; $i < $max; $i++) {
            $in_comment = highlightline($lines[$i], $i + 1, $marklines, $in_comment);
        }
    } else {
        echo '<tr><td>Invalid file specified.</td></tr>';
    }
    ?>
</table>
</td></tr></table>